from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible
from mall import settings

#1.您的自定义存储系统必须是以下子类 django.core.files.storage.Storage：
#4. django.utils.deconstruct.deconstructible类装饰器
@deconstructible
class MyStorage(Storage):

    #2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
    # 这意味着任何设置都应该来自django.conf.settings：
    def __init__(self, conf_path=None,ip=None):
        if not conf_path:
            conf_path = settings.FDFS_CLIENT_CONF
        self.conf_path = conf_path

        if not ip:
            ip = settings.FDFS_URL
        self.ip = ip

    #3.您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法
    #打开图片
    #我们的图片是通过http:// 访问来获取到的,所以不需要打开
    def _open(self, name, mode='rb'):
        pass

    #保存
    def _save(self, name, content, max_length=None):

        #1.创建FastDFS客户端
        #参数是客户端配置信息的路径
        # client = Fdfs_client('utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.conf_path)

        #2.获取图片

        #name只是图片的名字
        #只有一个名字的话,我们没有办法实现上传
        #content 内容,content就是图片的内容数据,我们通过read来读取
        #读取的是二进制数据
        data = content.read()

        #3.上传
        # client.upload_appender_by_filename() 根据文件的绝对路径来上传
        #client.upload_appender_by_buffer这个是上传二进制
        #result 就是上传的结果

        """
        {'Local file name': '/home/python/Desktop/images/1.jpg',
        'Status': 'Upload successed.', 'Storage IP': '192.168.229.133',
        'Group name': 'group1',
        'Remote file_id': 'group1/M00/00/03/wKjlhVvqiNmAbdPbAAAyZgOTZN0750.jpg',
        'Uploaded size': '12.00KB'}

        """

        result = client.upload_by_buffer(data)

        #4.根据上传的结果获取file_id
        if result.get('Status') == 'Upload successed.':
            file_id = result.get('Remote file_id')

            #我们把file_id返回给系统
            return file_id
        else:
            raise Exception('上传失败')

    #判断是否存在exists
    #因为Fdfs实现了文件的去重处理,会对重复的文件进行重命名处理
    #所以不需要判断是否存在
    def exists(self, name):
        return False

    def url(self, name):

        #name其实就是file_id
        #url应该是一个http://ip:port/ + name 才可以完整的访问我们的图片
        # return 'http://192.168.232.132:8888' + name
        # return settings.FDFS_URL + name
        return self.ip + name




